layui.define(['cookie','layer'],function(exports){
  let $ = layui.cookie();
  //公共业务的逻辑处理可以写在此处，切换任何页面都会执行
  let common = {
    /**
     * 自定义的帮助方法
     */
    util:{
      /**
       * 判断对象时候为空
       * @param object
       * @returns {boolean} false 不为空,  true为空
       */
      isEmpty:function (object) {
        if(object===undefined||object===''||object==null){
          return true;
        }else if(typeof object ==='object'){
          for (let key in object){
            return false;
          }
          return true;
        }else if(typeof object === 'array'&& object.length===0){
          return true;
        }
        return false;
      },
      /**
       * 判断对象时候不为空
       * @param object 对象
       * @returns {boolean} true 不为空, false 为空
       */
      isNotEmpty:function(object){
        return !common.util.isEmpty(object);
      },
    },
    /**
     * 对layui table 对象 二次封装 方便自己的使用习惯
     */
    table:{
      where: function(){
        let arr =[];
        $('[data-operator]').each(function () {
          let value =$.trim(this.value);
            if(value){
              if(this.dataset.type=="number"){
                value = Number(value);
              }
              arr.push({"name":this.name,"value":value ,"operator":this.dataset.operator});
            }
        });
        return {"queryWrapper": JSON.stringify(arr)};
      },
      render: function(options){
        let optionsTable=options.table?options.table:layui.table;
        let tableOptions = {
          url: options.url,
          text: {none: '暂无相关数据'},
          limit:options.limit?options.limit:20,
          toolbar:options.toolbar?options.toolbar:false,
          method: options.method?options.method:"POST",
          cols: options.cols,
          page: options.page?true:false,
          limits:options.limits?options.limits:[20,50,100,9999],
          where:common.table.where(options.where?options.where:{}),
          parseData: options.parseData?options.parseData:common.table.parseDataForPage,
        };
        tableOptions.elem||(options.id&&(tableOptions.elem = "#" + options.id));
        tableOptions.elem||(tableOptions.elem = "#"+common.page.info.list.tableId);
        options.defaultToolbar&&(tableOptions.defaultToolbar=options.defaultToolbar);
        options.width&&(tableOptions.width = options.width);
        tableOptions.toolbar||(common.page.info.list.tableToolbar.id&&(tableOptions.toolbar="#"+common.page.info.list.tableToolbar.id));
        if(common.util.isNotEmpty(common.page.info.list.tableRowToolbar.id)){
          let width = common.page.info.list.tableRowToolbar.width;
          width||(width=120);
          let row = {width:width, align:'center', title:'操作', toolbar: '#'+common.page.info.list.tableRowToolbar.id};
          if(tableOptions.cols[0]>10){
            row.fixed="right";
          }
          tableOptions.cols[0].push(row);

        }
        layui.jquery.extend(tableOptions,options.other);//扩展table 的拓展属性
        let result = {};
        layui.jquery.extend(result,tableOptions);
        return optionsTable.render(result);
      },
      reload: function(tableId){
        layui.table.reload(tableId ,{
               where: common.table.where() //设定异步数据接口的额外参数
           }
        );
      },
      parentReload:function (tableId,options) {
        if(parent&&parent.layui&&parent.layui.common){
          options=options?options:{};
          parent.layui.common.table.reload(tableId,options);
          let index = parent.layer.getFrameIndex(window.name); //获取窗口索引
          parent.layer.close(index);
        }
      },
      /**
       * layui table (不分页) 返回数据解析
       * @param result
       * @returns {{code: 0, data: *, count: *}|*}
       */
      parseDataForTable:function (result) {
        if(result.code==0){
          let data = result.data?result.data:[];
          return {"code":result.code,"count":data.length,"data":data}
        }
        return  result;
      },
      /**
       * layui table (分页) 返回数据解析
       * @param result
       * @returns {{code: *, data: *, count: *}|*}
       */
      parseDataForPage:function (result) {
        if (result.code == 0) {
          var page = result.data ? result.data : {"count": 0, "records": []};
          return {"code": result.code, "count": page.count, "data": page.records}
        }
        return result;
      },
    },
    ajax:{
      default:function(options){//这个是没有提示的
        let ajax = {
          url: options.url,
          data: options.data?options.data:{},
          type: options.type?options.type:"POST",
          async: options.async==true?true:false, //false 为同步
          dataType: options.dataType?options.dataType:"JSON",
        };
        if(options.success){
          ajax.success = options.success;
        }
        layui.jquery.ajax(ajax);
      },
      result:function(options){ //这个是有提示的
        let success = options.success;
        options.success = function(result){
          common.layer.result(result, success, options.fail);
        }
        common.ajax.default(options);
      }
    },
    /**
     * 弹窗
     */
    layer:{
      index:undefined,
      success:function(info,callback){
        var msg = typeof (info) == 'string'? info:"操作成功!!!";
        if(callback){
          layui.layer.msg(msg, {icon:6,time:800},function(){
            if(typeof (callback) =='function'){
              callback(info);
            }
          });
        }else{
          layui.layer.msg(msg, {icon: 6,time:800});
        }
      },
      fail:function(info,callback){
        let msg = typeof (info) == 'string'? info:"操作失败!!!";
        if(callback){
          layui.layer.msg(msg, {icon: 5,time:800},function(){
            if(typeof (callback) =='function'){
              callback(info);
            }
          });
        }else{
          layui.layer.msg(msg, {icon: 5,time:800});
        }
      },
      result:function(result,successCallback,failCallback){
        if(result.success){
          common.layer.success(common.util.isEmpty(result.msg)?"操作成功":result.msg,successCallback);
        }else{
          common.layer.fail(common.util.isEmpty(result.msg)?"操作成功":result.msg,failCallback);
        }
      },
      /**
       * 关闭 layer 弹窗 如果有index,就关闭当前
       * index, 如果没有就关闭全部
       */
      closeLayer: function(index){
        if(index){
          layui.layer.close(index);
        }else if(common.layer.index){
          layui.layer.close(common.layer.index);
        }else if(parent) {
          let index = parent.layer.getFrameIndex(window.name); //获取窗口索引
          parent.layer.close(index);
        }else {
          layui.layer.closeAll();
        }
        common.layer.index = undefined;
      },
      /**
       * 关闭上一级页面的弹窗
       */
      closeParentPageLayer: function(){
        if(parent&&parent.layui&&parent.layui.common){
          parent.layui.common.closeLayer();
        }
      },
      open:function (option) {
        common.layer.index = layui.layer.open(option);
        return common.layer.index;
      },
    },
    page:{
      /**
       * 信息
       */
      info:{
        /**
         * list 页面, 或者 edit 对应的父类页面
         */
        list:{
          /**
           * 数据表格的ID
           */
          tableId : undefined,
          /**
           * 数据表格的Filter
           */
          tableFilter: undefined,
          /**
           * 数据表格的 自定义工具栏
           */
          tableToolbar: {
            /**
             * 工具栏 ID
             */
            id:undefined,
            /**
             * 工具栏弹窗大小
             */
            area:undefined,
            /**
             * 工具栏对应的方法
             *  methods:{
             *      add:{url:"editPage",method:common.page.add},
             *      edit:{url:"editPage",method: common.page.edit},
             *      del:{url:"removed",method: common.page.removed},
             *   }
             *   field: 传递给后台字段名
             *   method: 调用的方法
             */
            methods:undefined,
          },
          /**
           * 搜索按钮Filter
           */
          searchFilter : undefined,
          /**
           * 行数据工具栏
           */
          tableRowToolbar:{
            id: undefined,
            methods: undefined,
            width: undefined, //宽度
          },
        },
        /**
         * 编辑或者新增页面
         */
        edit:{
          /**
           * 提交按钮 Filter
           */
          submitFilter:undefined,
          /**
           * 表单 Filter
           */
          formFilter: undefined,
          /**
           * 保存或者修改 的url
           */
          saveUrl: undefined,
        },
      },
      init:{
        /**
         * 搜索初始化
         * @param searchFilter
         */
        search: function(searchFilter,tableId){
          searchFilter||(searchFilter= common.page.info.list.searchFilter);
          if (common.util.isEmpty(searchFilter)){
            throw new Error("searchFilter入参为空或者common.page.info.list.tableFilter未定义");
          }
          tableId||(tableId = common.page.info.list.tableId);
          if (common.util.isEmpty(tableId)){
            throw new Error("tableId入参为空或者common.page.info.list.tableId未定义");
          }
          layui.form.on('submit('+searchFilter+')', function(data){
            common.table.reload(tableId);
            return false;
          });
        },
        /**
         * 表格初始化
         * @param options
         * @returns {*}
         */
        table:function(options){
          if(common.util.isEmpty(options.elem)&&common.util.isEmpty(options.id)&&common.util.isEmpty(common.page.info.list.tableId)){
            throw new Error("options.elem入参为空或者options.id入参为空或者common.page.info.list.tableId未定义");
          }
          return common.table.render(options);
        },
        /**
         * edit 页面提交按钮初始化
         * @param submitFilter
         * @param tableId
         * @param callback
         */
        editSubmit:function (submitFilter,tableId,callback) {
          submitFilter||(submitFilter=common.page.info.edit.submitFilter);
          tableId ||(tableId = common.page.info.list.tableId);
          callback || (callback = function(data) {
            for(let key in data.field){
              if(typeof data.field[key] ==='string'){
                data.field[key] = $.trim(data.field[key]);
              }
            }
            let url = common.page.info.edit.saveUrl;
            if(common.util.isEmpty(url)){
              throw new Error("Url 不能为空: common.page.info.edit.saveUrl 没有初始化")
            }
            common.ajax.result({
              url: url,
              data: data.field,
              success: function (result) {
                common.table.parentReload(tableId)
              }
            });
          });
          common.page.method.submit(submitFilter,callback)
        },
        /**
         * submit 按钮方法初始化
         * @param submitFilter
         * @param callback
         */
        submit:function (submitFilter,callback) {
          common.page.method.submit(submitFilter,callback);
        },
        /**
         * 数据表格工具栏初始化
         * @param tableFilter
         * @param methods
         */
        toolbar:function(tableFilter,methods){
          if(common.util.isEmpty(tableFilter)&&common.util.isEmpty(common.page.info.list.tableFilter)){
            throw new Error("tableId入参为空或者common.page.info.list.tableFilter");
          }
          tableFilter||(tableFilter=common.page.info.list.tableFilter);
          if(common.util.isEmpty(methods)&&common.util.isEmpty(common.page.info.list.tableToolbar.methods)){
            throw new Error("method入参为空或者common.page.info.list.method未定义");
          }
          methods||(methods=common.page.info.list.tableToolbar.methods);
          if(!methods){
            throw new Error("入参 tableFilter 未定义,或者 common.page.info.list.tableRowToolbar.methods 没有初始化")
          }
          layui.table.on('toolbar('+tableFilter+')', function(obj){
            for(let key in methods){
              if(obj.event== key){
                let method = methods[key];
                method.area = common.page.info.list.tableToolbar.area;
                method.content||(method.content=method.url);
                method.method(method);
              }
            }
          });
        },
        /**
         * 行数据 功能按钮
         * @param tableFilter
         * @param methods
         */
        rowToolbar:function(tableFilter,methods){//监听工具条
          tableFilter||(tableFilter = common.page.info.list.tableFilter);
          if(!tableFilter){
            throw new Error("入参 tableFilter 未定义,或者 common.page.info.list.tableFilter 没有初始化")
          }
          methods||(methods = common.page.info.list.tableRowToolbar.methods);
          if(!methods){
            throw new Error("入参 tableFilter 未定义,或者 common.page.info.list.tableRowToolbar.methods 没有初始化")
          }
          layui.table.on('tool('+tableFilter+')', function(obj){
            for(let key in methods){
              if(obj.event== key){
                let method = methods[key];
                method.area = common.page.info.list.tableToolbar.area;
                method.content||(method.content=method.url);
                method.id=obj.data.id;
                method.method(method);
              }
            }
          });
        },
        /**
         * edit 页面 数据验证
         * @param options
         */
        verify:function(options){
          layui.form.verify(options)
        },
        /**
         * 回车 表格重载
         * @param tableId
         */
        enterSearch:function(tableId){
          tableId||(tableId=common.page.info.list.tableId);
          document.onkeydown = function (e) { // 回车提交表单
            // 兼容FF和IE和Opera
            let theEvent = window.event || e;
            let code = theEvent.keyCode || theEvent.which || theEvent.charCode;
            if (code == 13) {
                common.table.reload(tableId)
            }
          }
        },
        escCloseLayer:function(){
          document.onkeydown = function (e) { // 回车提交表单
            // 兼容FF和IE和Opera
            let theEvent = window.event || e;
            let code = theEvent.keyCode || theEvent.which || theEvent.charCode;
            if (code == 27) {
              common.layer.closeLayer();
            }
          }
        },
      },
      method:{
        add: function (option){
          option.title ='新增';
          common.page.method.page(option)
        },
        edit:function(option){
          let editOption ={
            title:'修改'
          };
          if(!option.id){
            let tableId = option.tableId ?option.tableId:"table_list";
            let rows = layui.table.checkStatus(tableId).data;
            if(common.util.isEmpty(rows)){
              common.layer.fail("您没有选中您需要修改的数据");
              return;
            }
            if(rows.length != 1){
              common.layer.fail("您一次只能修改一条数据");
              return;
            }
            option.id = rows[0].id;
            if(!option.id){
              common.layer.fail("您选中的数据必须包含ID字段,且id不为空")
              return;
            }
          }
          $.extend(editOption, option);
          editOption.content = option.content +"?id="+option.id;
          common.page.method.page(editOption);
        },
        removed:function(options){
          let tableId = options.tableId ?options.tableId:"table_list";
          let one = new Array();
          if(options.id){
            one.push({name:"id",operator:"eq",value:options.id});
          }else{
            let rows = layui.table.checkStatus(tableId).data;
            if(common.util.isEmpty(rows)){
              common.layer.fail("您没有选中您需要删除的数据");
              return;
            }
            let two = new Array();
            rows.forEach((row,index,array)=>{
              if(!row.id){
                console.log(row);
                throw new Error("id 不能为空");
              }
              two.push(row.id);
            });
            if(common.util.isEmpty(two)){
              console.log(two);
              throw new Error("错误的数据,没有收集到可用的条件")
            }
            one.push({name:"id",operator:"in",value:two});
          }

          common.ajax.result({
            url:options.url?options.url:options.content,
            data:{"queryWrapper":JSON.stringify(one)},
            success:function (data) {
              common.table.parentReload(tableId);
            }
          });
        },
        page: function(option){
          let editOption={
            type: common.util.isEmpty(option.type)?2:option.type,
            id: 'page_'+option.type,
            content: option.content,
            shade: 0.3 ,
            area : option.area?option.area:['800px' , '800px'],
          };
          if(option.title){
            editOption.title = option.title;
          }
          if(option.success){
            editOption.success = option.success;
          }
          if(option.fail){
            editOption.fail = option.fail;
          }
          return common.layer.open(editOption);
        },
        /**
         * submit 按钮方法初始化
         * @param submitFilter
         * @param callback
         */
        submit:function (submitFilter,callback) {
          layui.form.on('submit('+submitFilter+')', function(data){
            callback&&(callback(data));
            return false;
          });
        },
      },
    }
  };
  $.ajaxSetup({ //全局定义
    async:false, // 默认true，异步
    method:"POST",
    // beforeSend:function(xhr){// 发送请求前，可以对data、url等处理
    //   console.log("beforeSend")
    //   console.log(xhr);
    // },
    // complete:function(xhr, status){// 返回数据，根据数据调转页面等
    //   console.log("complete")
    //   console.log(xhr);
    //   console.log(status);
    // },
    // error:function(xhr,status,error){  //请求失败遇到异常触发
    //   console.log("error")
    //   console.log(xhr);
    //   console.log(status);
    //   console.log(error);
    // }
  });
  //对外暴露的接口
  exports('common', common);
});